import axios from "axios";
import store from "../store/index";
import {save,load} from "./localcache";

const baseURL = "/api";

const set = new Set();

/**
 * 
 * @param {String} url 请求地址
 * @param {Object} data 请求参数
 * @param {String} method 请求方法，默认为POST
 * @returns 
 */
const ajax = function(url,data = {},method="post") {

    // 生成key
    const key = url + JSON.stringify(data) + method;

    // 先从本地缓存读取数据
    let obj = load(key);
    if (obj != null){
        console.log("缓存命中！");
        return Promise.resolve({data:obj});
    }

    if (set.has(key)) {
        console.log("请勿重复请求！");
        return Promise.reject({status: -1,msg: "请勿重复请求"});
    }

    set.add(key);

    return axios({
        baseURL,
        url,
        data,
        method
    });
};

// 请求拦截器
axios.interceptors.request.use(config => {
    // console.log("config = ",config)
    // 如果用户登录后，有token，那么进行添加
    const token = store.state?.loginUser?.token || null;
    if (token) {
        config.headers.Authorization = token;
    }
    return config;
})

// 失败预处理
axios.interceptors.response.use(res => {
    const key = res.config.url + res.config.data + res.config.method;
    // console.log("res.key = ",key);
    // 移除key
    set.delete(key);

    // 逻辑失败，当正文参数中的status小于0
    if (res.data.status < 0) {
        console.log("逻辑失败：",res.data.msg);
        alert(res.data.msg); 
    } else {
        save(res.config.url,res.config.data,res.config.method,res.data);
    }
    return res;
},error => {
    const key = error.config.url + error.config.data + error.config.method;
    // console.log("error.key = ",key);
    // 移除key
    set.delete(key);

    // console.log("请求失败：",error);
    alert({type: "error",message: error});
    Promise.reject({status: -1,msg: "网络错误"});
})

export default ajax;